package main

import (
	"fmt"
	"sort"
)

type Card struct{
	Suit  int    //程序统一标准：0是黑桃、1是红桃、2是梅花、3是方片
	Value int    //0代表‘牌2’、1代表‘牌3’...etc
}

func NewCard(suit int, val int) *Card{
	card := &Card{
		suit,
		val,
	}
	return card
}

//实现sort包中的排序接口
type Cards []*Card

func (c Cards) Len() int {
	return len(c)
}

func (c Cards) Less(i, j int)bool {
	return c[i].Value > c[j].Value
}

func (c Cards) Swap(i, j int){
	tmp := c[i]
	c[i] = c[j]
	c[j] = tmp
}


func test1() {
	cards := Cards{
		NewCard(0, 4),
		NewCard(0, 2),
		NewCard(0, 5),
	}
	sort.Sort(cards) //从大到小排序
	for k, card := range cards {
		fmt.Println(k, card)
	}
}



/////////////////////////////
type Person struct {
	Name string    // 姓名
	Age  int    // 年纪
}

type PersonWrapper struct {
	people [] Person
	by func(p, q * Person) bool
}

func (pw PersonWrapper) Len() int {    // 重写 Len() 方法
	return len(pw.people)
}
func (pw PersonWrapper) Swap(i, j int){     // 重写 Swap() 方法
	pw.people[i], pw.people[j] = pw.people[j], pw.people[i]
}
func (pw PersonWrapper) Less(i, j int) bool {    // 重写 Less() 方法
	return pw.by(&pw.people[i], &pw.people[j])
}

func test2() {
	people := [] Person{
		{"zhang san", 12},
		{"li si", 30},
		{"wang wu", 52},
		{"zhao liu", 26},
	}

	fmt.Println(people)

	sort.Sort(PersonWrapper{people, func (p, q *Person) bool {
		return q.Age < p.Age    // Age 递减排序
	}})

	fmt.Println(people)
	sort.Sort(PersonWrapper{people, func (p, q *Person) bool {
		return p.Name < q.Name    // Name 递增排序
	}})

	fmt.Println(people)

}

func main(){
	//test1()
	test2()
}